/**
 * Copyright 2006 gworks.com.au
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License. (http://www.apache.org/licenses/LICENSE-2.0)
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed 
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for 
 * the specific language governing permissions and limitations under the License.
 *
 * <dhamma-message src="Atisha (11th century Tibetan Buddhist master)">
 * 	The greatest achievement is selflessness. The greatest worth is self-mastery.
 * 	The greatest quality is seeking to serve others. The greatest precept is continual awareness.
 * 	The greatest medicine is the emptiness of everything. The greatest action is not conforming with the worlds ways.
 * 	The greatest magic is transmuting the passions. The greatest generosity is non-attachment.
 * 	The greatest goodness is a peaceful mind. The greatest patience is humility.
 * 	The greatest effort is not concerned with results. The greatest meditation is a mind that lets go.
 * 	The greatest wisdom is seeing through appearances. 
 * </dhamma-message>
 */
package au.com.gworks.jump.app.util;


import org.javaongems.runtime.io.PathUtils;

import au.com.gworks.jump.io.PathStatus;
import au.com.gworks.jump.io.ResourceAttributes;

final public class RequestPathInfo {
	final public String revSpecifier;
	final public String namespace, context;
	final public String path;
	final public Integer revision, headRevision;
	final public int pathStatus;
	final public ResourceAttributes attributes;
	final public boolean wasRevisionSpecified;
	final public boolean isNamespaceAdmin;
	
	public RequestPathInfo(String revId, String ctx, String nmspace, boolean admin, String pth, boolean wasRevSpecified, Integer rev, Integer head, ResourceAttributes ra, int status) {
		revSpecifier = revId;
		namespace = nmspace;
		context = ctx;
		path = pth;
		revision = rev;
		headRevision = head;
		attributes = ra; 
		pathStatus = status;
		wasRevisionSpecified = wasRevSpecified;
		isNamespaceAdmin = admin;
	}
	
	public long getRevisionAsAt() {
		if (attributes == null)
			return 0;
		return attributes.getLastModified();
	}
	
	public boolean isFolderPath() {
		return PathStatus.IS_FOLDER == pathStatus;
	}
	
	public boolean isDocumentPath() {
		return PathStatus.IS_DOCUMENT == pathStatus;
	}
	
	public boolean isHeadRevision() {
		return revision.equals(headRevision);
	}
	
	public boolean isEditableContext() {
		return isHeadRevision();
	}
	
	public String getExtendedContext(boolean inclRevInfo) {
		StringBuffer buff = new StringBuffer(PathUtils.FORWARD_SLASH);
		buff.append(context).append(PathUtils.FORWARD_SLASH).append(namespace);
		if (inclRevInfo && wasRevisionSpecified)
			appendRevToContext(buff, revision);
		return buff.toString();
	}

	public String getOrigRevisionContext(boolean inclRevInfo) {
		StringBuffer buff = new StringBuffer(PathUtils.FORWARD_SLASH);
		buff.append(context).append(PathUtils.FORWARD_SLASH).append(namespace);
		if (inclRevInfo && wasRevisionSpecified)
			wrapRevisionTags(buff, revSpecifier);
		return buff.toString();
	}
	
	private void appendRevToContext(StringBuffer buff, Integer rev) {
		wrapRevisionTags(buff, EnvironmentUtils.ENV_REV_SPECIFIER_REVISION + rev.toString());
	}
	
	private void wrapRevisionTags(StringBuffer buff, String spec) {
		buff.append(PathUtils.FORWARD_SLASH).append(EnvironmentUtils.ENV_REV_SPECIFIER_BEGIN)
		.append(spec).append(EnvironmentUtils.ENV_REV_SPECIFIER_END);
	}

	public String makeBaseRevisionContext() {
		StringBuffer buff = new StringBuffer(getExtendedContext(false));
		appendRevToContext(buff, headRevision);
		buff.append(path);
		return buff.toString();
	}
}